/*
 * Copyright 2007 Yusuke Yamamoto
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;

import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;

/**
 * @author Yusuke Yamamoto - yusuke at mac.com
 * @since Twitter4J 2.1.7
 */
public class GetAccessToken {
	/**
	 * Usage: java twitter4j.examples.oauth.GetAccessToken [consumer key]
	 * [consumer secret]
	 * 
	 * @param args
	 *            message
	 */
	public static void main(String[] args) {
		args = new String[2];
		args[0] = "5ob63xUZA7MMHPWZURJ8w";
		args[1] = "BjH6JUZ03aymAu5Gs6y1gF24hiFRqfWGT8uHtzucc";
		File file = new File("twitter4j.properties");
		Properties prop = new Properties();
		InputStream is = null;
		OutputStream os = null;
		try {
			if (file.exists()) {
				is = new FileInputStream(file);
				prop.load(is);
			}
			if (args.length < 2) {
				if (null == prop.getProperty("oauth.consumerKey")
						&& null == prop.getProperty("oauth.consumerSecret")) {
					// consumer key/secret are not set in twitter4j.properties
					System.out
							.println("Usage: java twitter4j.examples.oauth.GetAccessToken [consumer key] [consumer secret]");
					System.exit(-1);
				}
			} else {
				prop.setProperty("oauth.consumerKey", args[0]);
				prop.setProperty("oauth.consumerSecret", args[1]);
				os = new FileOutputStream("twitter4j.properties");
				prop.store(os, "twitter4j.properties");
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
			System.exit(-1);
		} finally {
			if (null != is) {
				try {
					is.close();
				} catch (IOException ignore) {
				}
			}
			if (null != os) {
				try {
					os.close();
				} catch (IOException ignore) {
				}
			}
		}
		try {
			Twitter twitter = new TwitterFactory().getInstance();
			RequestToken requestToken = twitter.getOAuthRequestToken();
			System.out.println("Got request token.");
			System.out.println("Request token: " + requestToken.getToken());
			System.out.println("Request token secret: "
					+ requestToken.getTokenSecret());
			AccessToken accessToken = null;

			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			while (null == accessToken) {
				System.out
						.println("Open the following URL and grant access to your account:");
				System.out.println(requestToken.getAuthorizationURL());
				try {
					Desktop.getDesktop().browse(
							new URI(requestToken.getAuthorizationURL()));
				} catch (IOException ignore) {
				} catch (URISyntaxException e) {
					throw new AssertionError(e);
				}
				System.out
						.print("Enter the PIN(if available) and hit enter after you granted access.[PIN]:");
				String pin = br.readLine();
				try {
					if (pin.length() > 0) {
						accessToken = twitter.getOAuthAccessToken(requestToken,
								pin);
					} else {
						accessToken = twitter.getOAuthAccessToken(requestToken);
					}
				} catch (TwitterException te) {
					if (401 == te.getStatusCode()) {
						System.out.println("Unable to get the access token.");
					} else {
						te.printStackTrace();
					}
				}
			}
			System.out.println("Got access token.");
			System.out.println("Access token: " + accessToken.getToken());
			System.out.println("Access token secret: "
					+ accessToken.getTokenSecret());
			
			System.out.println(twitter.getScreenName());
			
			try {
				prop.setProperty("oauth.accessToken", accessToken.getToken());
				prop.setProperty("oauth.accessTokenSecret", accessToken
						.getTokenSecret());
				os = new FileOutputStream(file);
				prop.store(os, "twitter4j.properties");
				os.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
				System.exit(-1);
			} finally {
				if (null != os) {
					try {
						os.close();
					} catch (IOException ignore) {
					}
				}
			}
			System.out.println("Successfully stored access token to "
					+ file.getAbsolutePath() + ".");
			System.exit(0);
		} catch (TwitterException te) {
			te.printStackTrace();
			System.out.println("Failed to get accessToken: " + te.getMessage());
			System.exit(-1);
		} catch (IOException ioe) {
			ioe.printStackTrace();
			System.out.println("Failed to read the system input.");
			System.exit(-1);
		}
	}
}
